/*
 * memory.h
 *
 *  Created on: 2016年8月7日
 *      Author: pengzhikang
 */
#ifndef _MEMORY_H
#define _MEMORY_H 1

#define EFLAGS_AC_BIT 0x00040000 // 100 0000 0000 0000 0000,用于设置EFLAGS中的AC位
#define CR0_CACHE_DISABLE 0x60000000/* 用于设置和清除CR0的NW与CD位 */
#define MEMMAN_FREES 4090/* FREEINFO结构的数量 大约是32KB */
#define MEMMAN_ADDRESS 0x003c0000

/**
 * 内存可用信息条目
 * addr 可用内存块首地址
 * size 可用内存块大小
 */
struct FREEINFO {
	unsigned int address, size;
};

/**
 * 内存管理
 * frees:当前可用的信息数量
 * maxfrees:frees的最大值
 * lostsize:释放内存失败的大小总和
 * lost:释放失败次数
 */
struct MEMMAN {
	int frees, maxfrees, lostsize, losts;
	struct FREEINFO free[MEMMAN_FREES];
};

unsigned int memman_alloc_4k(struct MEMMAN * man, unsigned int size);
int memman_free_4k(struct MEMMAN * man, unsigned int address, unsigned int size);
void memman_init(struct MEMMAN *man);
unsigned int memman_total(struct MEMMAN *man);
unsigned int memman_alloc(struct MEMMAN *man, unsigned int size);
int memman_free(struct MEMMAN *man, unsigned int address, unsigned int size);
unsigned int memtest(unsigned int start, unsigned int end);

#endif
